// #include "f.h"
#include<stdio.h>
#include<string.h>

typedef struct  Book{
	char bookname[20];
	int booknum;
    int bookprice;
	char bookaddress[20];
    int paimin;
}book;

typedef struct yonghus{
    int zhanghu;
    int mima;
}yonghu;

void fenge(void){//分隔每次操作
    printf("**********************************************\n");
}

void input(book* stu,int *len,int* n){ //输入
    printf("图书种类数量:<=%d:",*n);
    scanf("%d",len);
    if(*len >*n){
        printf("请输入100以内的数\n");
        return;
    }
    for(int i=0;i<*len;i++){
        printf("请输入第%d种书的名字： 数量：  价格(元)： 出版社： 成绩：(空格隔开)\n",i+1);
        scanf("%s %d %d %s",stu[i].bookname,&stu[i].booknum,&stu[i].bookprice,stu[i].bookaddress);
    }
    printf("添加成功!\n");
}

void tianjia(book* stu,int* len,int* len2,int* n){ // 添加图书
    printf("请输入要添加的图书种类数量(%d<=):",*n-*len);
    scanf("%d",len2);
    if(*len2 > (100-*len)){
        printf("数量超出容纳，请重新输入\n");
        return;
    }
    for(int i=*len;i<(*len)+(*len2);i++){
        printf("请输入第%d种书的名字： 数量：  价格(元)： 出版社：(空格隔开)\n",i+1);
        scanf("%s %d %d %s",stu[i].bookname,&stu[i].booknum,&stu[i].bookprice,stu[i].bookaddress);
        for(int j=0;j<*len;j++){
            if(strcmp(stu[i].bookname,stu[j].bookname) == 0){
                memset(&stu[i],0,sizeof(stu[i]));
                printf("已有此书,请勿重复添加\n");
                return; 
            }
        }
    }
    (*len)+=(*len2);
    printf("添加成功!\n");
}

int search(int n,book* stu,int* len){   //寻找
    char ch[20]="";
    int k=0;
    int panduan=1;
    switch (n){
        case 1:
        printf("请输入图书名字:");//书名查找
        scanf("%s",ch);
        for(int i=0;i<*len;i++){
            if(strlen(ch) == strlen(stu[i].bookname)){
                panduan=strcmp(stu[i].bookname,ch);
            }
            if(panduan == 0){
                printf("书名：%s 数量：%d  价格：%d元 出版社：%s\n",
                stu[i].bookname,stu[i].booknum,stu[i].bookprice,stu[i].bookaddress);
                return i;
            }
        }
        if(panduan != 0){
            printf("未查询到此书\n");
            return -1; 
        }
            break;
        case 2:     //数量查找
            printf("请输入数量:");
            scanf("%d",&k);
            for(int i =0;i<*len;i++){
                if(stu[i].booknum == k){
                printf("书名：%s 数量：%d  价格：%d元 出版社：%s\n",
                stu[i].bookname,stu[i].booknum,stu[i].bookprice,stu[i].bookaddress);
                panduan=0;
                }
            }
            if(panduan != 0){
                printf("未查询到有此数量的书\n");
                return -1; 
            }
            break;
        case 3:     //价格查找
            printf("请输入价格(元):");
            scanf("%d",&k);
            for(int i =0;i<(*len);i++){
                if(stu[i].bookprice == k){
                printf("书名：%s 数量：%d  价格：%d元 出版社：%s\n",
                stu[i].bookname,stu[i].booknum,stu[i].bookprice,stu[i].bookaddress);
                panduan=0;
                }
            }
            if(panduan != 0 ){
                printf("未查询到该价格的书\n");
                return -1; 
            }
            
            break;
        case 4:
            printf("请输入出版社名字:");//书名查找
            scanf("%s",ch);
            for(int i=0;i<*len;i++){
                    if(strlen(ch) == strlen(stu[i].bookaddress)){
                    panduan=strcmp(stu[i].bookaddress,ch);
                }
                if(panduan == 0){
                    printf("书名：%s 数量：%d  价格：%d元 出版社：%s\n",
                    stu[i].bookname,stu[i].booknum,stu[i].bookprice,stu[i].bookaddress);
                }
            }
            if(panduan != 0){
                printf("未查询到此出版社\n");
                return -1; 
            } 
            break;
        
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    
}

void dayin(const book* stu,int *len){       //打印全部图书信息
    for(int i=0; i<*len;i++){
        printf("书名：%s 数量：%d  价格：%d元 出版社：%s\n",
        stu[i].bookname,stu[i].booknum,stu[i].bookprice,stu[i].bookaddress);
    }
}

void xiugai(int n,book* stu,int* len){      //修改图书信息
    int i =search(1,stu,len);
    if(i == -1){
        return;
    }
    printf("请输入修改后书的名字： 数量：  价格(元)： 出版社： 成绩：(空格隔开)\n");
    scanf("%s %d %d %s",stu[i].bookname,&stu[i].booknum,&stu[i].bookprice,stu[i].bookaddress);
    printf("修改成功\n");
}

void delete(book* stu,int* len){      //删除图书信息
    int i =search(1,stu,len);
    memset(&stu[i],0,sizeof(stu[i]));
    for(int j =i; j<*len;j++){
        stu[j]=stu[j+1];
    }
    (*len)--;
    printf("删除成功\n");
}

void sort(book* stu,int *len){    //排序
    int pai[100]={0};
    int n=*len;
    for(int i= 0;i<*len;i++){
        pai[i]=stu[i].bookprice;
    }
    for(int i=0;i<*len-1;i++){
        for(int j=0;j<*len-i-1;j++){
            if(pai[j] < pai[j+1]){
                int temp=pai[j];
                pai[j]=pai[j+1];
                pai[j+1]=temp;
            }
        }
    }

    for(int i=0;i<*len;i++){   //去掉重复,有的价格一样,排名也要一样
        for(int j=i+1;j<n;j++){
            if(pai[j] == pai[i]){
                int tmp;
                for(tmp=j;tmp<*len;tmp++){
                    pai[tmp]=pai[tmp+1];
                }
                j--;
                n--;
            }
        }
        
    }

    for(int i=0;i<*len;i++){ //根据价格排名
        for(int j=0;j<*len;j++){
            if(pai[i] == stu[j].bookprice){
               stu[j].paimin=i+1; 
            }
        }      
    }
}

void sortprint(const book* stu,int *len){   //按序打印
    int k=0;//选择
    printf("1,正序 2,倒序:");
    scanf("%d",&k);
    switch (k){
        case 1:
            for(int i=1;i<=*len;i++){ //正序
                for(int j=0;j<*len;j++){
                    if(stu[j].paimin == i){
                        printf("书名：%s 数量：%d  价格：%d元 出版社：%s  排名:%d\n",
                        stu[j].bookname,stu[j].booknum,stu[j].bookprice,stu[j].bookaddress,stu[j].paimin); 
                }
                }
            }
            break;
        case 2:
            for(int i=*len;0<i;i--){ //倒序
                for(int j=0;j<*len;j++){
                    if(stu[j].paimin == i){
                        printf("书名：%s 数量：%d  价格：%d元 出版社：%s  排名:%d\n",
                        stu[j].bookname,stu[j].booknum,stu[j].bookprice,stu[j].bookaddress,stu[j].paimin); 
                }
                }
            }
            break;

        default:
            break;
    }
}

void shop(book *stu,int *len){//购买界面
    int true=1,k=0,value=0,num=0;
    char ch[20]="";
    while(true){
        printf("1购买 2退出购买\n");
        scanf("%d",&k);
        if(k == 1){
            int i=search(1,stu,len);
            printf("请输入购买数量: ");
            scanf("%d",&num);
            if(num > stu[i].booknum){
                printf("购买失败,数量超出,只剩下%d本书\n",stu[i].booknum);
            }
            else{
                value+=num*(stu[i].bookprice);
                stu[i].booknum = stu[i].booknum - num;
            }
        }
        else if(k == 2){
            true=0;
        }
        else{
            printf("输入错误,请重新输入\n");
        }

    }
    printf("应支付%d元\n",value);

}

void xitong(book* stu,int *len,int* len2,int *n){      //系统页面功能选择
    int true=1,k=0;
    while(true){
        fenge();
        printf("请选择:1查看所有图书信息,2指定查询,3添加图书信息,4修改图书信息,5删除图书信息,6购买,7查询价格榜,8退出\n");
        scanf("%d",&k);
        if(k == 1){
            dayin(stu,len);
        }
         else if(k == 2){
            int n=0;
            printf("1按书名搜寻,2按数量搜寻,3按价格搜寻,4按出版社搜寻\n");
            scanf("%d",&n);
            search(n,stu,len);
        }
        else if(k == 3){
            int n2=0;
            printf("请选择:1从头开始输入,2继续添加\n");
            scanf("%d",&n2);
            if(n2 == 1){
                memset(&stu,0,sizeof(stu));
            }
            switch (n2)
            {
            case 1:
                input(stu,len,n);
                break;
            case 2:
                tianjia(stu,len,len2,n);
                break;
            default:
                break;
            }
        }
        else if(k == 4){
            xiugai(2,stu,len);
        }
        else if(k == 5){
            delete(stu,len);
        }
        else if(k == 6){
            shop(stu,len);
            
        }
        else if(k == 7){
            sort(stu,len);
            sortprint(stu,len);
        }
        else if(k == 8){
            true=0;
        }
        else{
            printf("输入错误,请重新输入\n");
        }
        fenge();

    }
}

void getin(yonghu* yh,int* yonghulen,int *len,book* stu,int* len2,int* n){   //登陆注册界面
    int choose=0,true=2,mima=0,zhanghu=0;
    while(true){
        printf("请选择:1登陆,2注册,3退出\n");
        scanf("%d",&choose);
        switch (choose)
        {
            case 1:
                printf("请输入账户: 密码: (用空格隔开)\n");
                scanf("%d %d",&zhanghu,&mima);
                for(int i=0;i<*yonghulen;i++){
                    if((yh[i].zhanghu == zhanghu) && (yh[i].mima == mima)){
                        printf("登陆成功\n");
                        xitong(stu,len,len2,n);
                    }
                }
                break;
            case 2:
                if(*yonghulen > 31){
                    *yonghulen=31;
                    printf("用户已达上限\n");
                    break;
                }
                printf("请输入要注册的账户: 密码: (用空格隔开)\n");
                scanf("%d %d",&yh[*yonghulen].zhanghu,&yh[*yonghulen].mima);
                (*yonghulen)++;
                printf("注册成功\n");
                break;
            default:
                true=0;
                break;
        }
    } 
}


int main(void)
{	
    int len=10;//图书种类总数量
    int len2=0;//要添加的种类数量
    int yonghulen=1;    //用户账号数量

    book stu[100]={
        {"a",1,2,"aa",0},	
	    {"b",2,7,"bb",0},	
	    {"c",3,6,"cc",0},	
	    {"d",4,10,"dd",0},	
	    {"e",5,17,"ee",0},
	    {"f",6,15,"ff",0},	
	    {"g",7,27,"gg",0},	
	    {"h",8,21,"hh",0},	
	    {"i",9,29,"ii",0},	
	    {"j",10,20,"jj",0}
    };
    int n=sizeof(stu)/sizeof(stu[0]);

    yonghu yh[32]={
        {3164,12345}
    };

    getin(yh,&yonghulen,&len,stu,&len2,&n);
	return 0;
}